package com.spic.system.activiti.service;

import com.spic.common.core.web.domain.AjaxResult;
import com.spic.system.activiti.domain.dto.ActWorkflowFormDataDTO;
import com.spic.system.activiti.domain.dto.TaskTodoDTO;
import com.spic.system.api.domain.ActTaskStartDto;
import com.spic.system.api.domain.HiddenTodoTask;
import com.spic.system.domain.vo.DoTaskParam;
import org.springframework.web.bind.annotation.RequestParam;

import java.text.ParseException;
import java.util.List;

/**
 * @Description 工作任务
 * @Author AnQi
 * @Date 2021/11/18
 */
public interface IMyTaskService {

    /**
     * 启动工作流
     * @param dto
     * @return
     */
    Object startInstance(ActTaskStartDto dto);

    /**
     * 完成任务
     * @param taskId 任务ID
     */
    void completeTask(String taskId);

    /**
     * 带评论完成任务
     * @param taskId
     * @param params  获取form 审批意见表单值
     *
     *     问题和说明：
     *        1.两个并行审批节点同时指定下一节点人时 会覆盖
     *        2.侯选人节点 必须在上一个节点指定
     *        3.每个节点配置审批人时都是唯一的（流程图配置）；taskMap对象是定义下个候选人的map：key：表示节点的变量 value:表示候选人
     *        4.每个taskKey节点也是唯一(在流程图配置)，提前定义在前端页面上，根据当前taskKey进行判断，显示当前审批表单
     *        5.意见表单（审批人审批、各种时间）的值如何入库？更新业务表单？
     */
    void completeWithComment(String taskId, DoTaskParam taskParam);

    /**
     * 保存表单
     * @param taskID
     * @param formData
     * @return
     * @throws ParseException
     */
    int formDataSave(String taskID, List<ActWorkflowFormDataDTO> formData ) throws ParseException;

    AjaxResult backProcess(@RequestParam String taskId,@RequestParam String targetActivityId);

    List<HiddenTodoTask> getHiddenTodos(HiddenTodoTask hiddenTodoTask);

    AjaxResult getTodos(TaskTodoDTO taskTodoDTO);
    /**
     * 根据流程实例id获取流程任务当前节点信息列表
     * @return todos 任务当前节点key列表
     */
    List<String> getTaskInfoList(List<String> list);

    /**
     * 会签流程   根据processInstanceId查询 task 任务列表
     * @param processInstanceId
     * @return
     */
    List<String> getMulitInstanceTask(String processInstanceId,String definitonKey);

    List<String> getRunTaskInstanceTask(String processInstanceId);
}
